package com.doctcloud.common.core.annotation;

import org.apache.poi.hpsf.Decimal;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.math.BigDecimal;

/**
 * 自定义注解 @NotZero 的校验器实现
 * 功能：校验数值类型的值既不能为 null，也不能为 0
 */
public class NotZeroValidator implements ConstraintValidator<NotZero, Number> {

    /**
     * 校验逻辑实现
     * @param value 待校验的值（支持 Integer、Long、Double、Float 等 Number 子类）
     * @param context 校验上下文（可用于自定义错误消息）
     * @return true：校验通过（非 null 且非 0）；false：校验失败（为 null 或为 0）
     */
    @Override
    public boolean isValid(Number value, ConstraintValidatorContext context) {
        // 1. 先判断是否为 null：如果为 null，直接返回 false（校验失败）
        if (value == null) {
            return false;
        }

        // 2. 再判断是否为 0（根据不同数值类型分别处理，避免类型转换误差）
        if (value instanceof Integer) {
            return (Integer) value != 0;
        } else if (value instanceof Long) {
            return (Long) value != 0L;
        } else if (value instanceof Double) {
            // 注意：Double 存在精度问题，这里仅判断严格等于 0.0（如需宽松判断可调整，如与 0 的差值小于某个阈值）
            return (Double) value != 0.0;
        } else if (value instanceof Float) {
            return (Float) value != 0.0f;
        } else if (value instanceof Short) {
            return (Short) value != 0;
        } else if (value instanceof Byte) {
            return (Byte) value != 0;
        }

        // 其他未覆盖的数值类型（如 BigInteger 等），默认校验失败
        return false;
    }
}